package com.changgou.oauth.service.impl;

import com.changgou.oauth.service.LonginUserService;
import com.changgou.oauth.util.AuthToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.io.UnsupportedEncodingException;
import java.util.Base64;
import java.util.Map;

@Service
public class LonginUserServiceImpl implements LonginUserService {
        //实现请求发送
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    /***
     *  @param username  用户名
     * @param password  用户密码
     * @param clientId  客户端id
     * @param clientSecret    客户端密钥
     * @param grant_type     授权方式
*                     1,账户： username = szitheima
*                       2，密码 ：  password = szitheima
*                      3， clientId =  changhou   //在配置文件配置的有
*                       4. clientSecret = changgou
     * @return
     */
    @Override
    public AuthToken longin(String username, String password, String clientId, String clientSecret, String grant_type) throws UnsupportedEncodingException {
        ServiceInstance serviceInstance = loadBalancerClient.choose("user-auth");
        if (serviceInstance == null) {
            throw new RuntimeException("找不到对应的服务");
        }
        //调用的请求地址 申请令牌： http://localhost:9001/oauth/token     这里和前面用postman请求的地址一样，也就是自己的oauth服务地址
        String url = serviceInstance.getUri().toString() + "/oauth/token";

        //请求提交的数据进行封装
        MultiValueMap<String,String> parameterMap = new LinkedMultiValueMap<>();
        parameterMap.add("username",username);
        parameterMap.add("password",password);
        parameterMap.add("grant_type",grant_type);

        //请求头封装   之前用postman的时候是在头中进行传输过去，现在在这设置      Basic Base64(客户端id:客户端密钥)
        String Authorization = "Basic "+new String(Base64.getEncoder().encode((clientId+":"+clientSecret).getBytes()),"UTF-8") ;
        MultiValueMap<String,String> headerMap = new LinkedMultiValueMap<>();
        headerMap.add("Authorization",Authorization);

        //HttpEntity->创建对象 封装了请求头和请求体   通过查询源码得到参数
        HttpEntity httpEntity = new HttpEntity(parameterMap,headerMap);

        /****
         * 1:请求地址
         * 2： 请求方式
         * 3： requestEntity：请求提交的数据信息封装 请求头， 请求体
         * 4： responseType ： 返回数据需要转化的类型
         */
        ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, Map.class);
        //登录后的令牌信息    可以转为map，   示例图看笔记
        Map<String ,String>  body = response.getBody();

        //将令牌信息转为authtoken对象
        AuthToken authToken = new AuthToken();
        authToken.setAccessToken(body.get("access_token"));
        authToken.setRefreshToken("refresh_token");
        authToken.setJti("jti");

        return authToken;
    }
}
